﻿using DevExpress.Spreadsheet.Functions;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UserDefineFunction.PME.Single
{
    public class PMEGetMonthData :  FunctionLib.Single.PMEGetMonthData, ICustomFunction
    {
        public ParameterType ReturnType => ParameterType.Value;
        readonly ParameterInfo[] functionParameters = new ParameterInfo[15] {
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any),
            new ParameterInfo(ParameterType.Any)
        };
        public ParameterInfo[] Parameters => functionParameters;

        public bool Volatile => false;

        public ParameterValue Evaluate(IList<ParameterValue> parameters, EvaluationContext context)
        {
            if (parameters.Count() != 15 || !parameters[2].IsNumeric || !parameters[3].IsNumeric || !parameters[4].IsNumeric )
            {
                return null;
            }
            for (int i = 5; i < 15; i++)
            {
                if (!(parameters[i].IsNumeric || parameters[i].IsEmpty))
                {
                    return null;
                }
            }
            var _params = (from c in parameters select c.ToString()).ToArray();
            object[] _param = new object[15];
            for (int i = 5; i < 15; i++)
            {
                if (parameters[i].IsNumeric)
                {
                    _param[i] = parameters[i].NumericValue;
                }
                else if (parameters[i].IsEmpty)
                {
                    _param[i] = null;
                }
                else
                {
                    return null;
                }
            }
            _param[0] = parameters[0].ToString();
            _param[1] = parameters[1].ToString();
            _param[2] = parameters[2].NumericValue;
            _param[3] = parameters[3].NumericValue;
            _param[4] = parameters[4].NumericValue;
            if (_param[5] == null || _param[6] == null)
            {
                _param = _param.Take(5).ToArray();
            }
            else if (_param[7] == null || _param[8] == null)
            {
                _param = _param.Take(7).ToArray();
            }
            else if (_param[9] == null || _param[10] == null)
            {
                _param = _param.Take(9).ToArray();
            }
            else if (_param[11] == null || _param[12] == null)
            {
                _param = _param.Take(11).ToArray();
            }
            else if (_param[13] == null || _param[14] == null)
            {
                _param = _param.Take(13).ToArray();
            }
            var res = Help.ConvertToReturnValue(this.Calc(_param));
            return res;
        }

        public string GetName(CultureInfo culture)
        {
            return Name;
        }
    }
}
